package com.shen.jcbf.jdk8bf.lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 测试 lambda 表达式案例
 *
 * Lambda表达式本质上是将一个函数的代码作为一个参数或变量进行传递，这种处理方式有个专门的名字——函数式编程。
 */
public class TestLambdaTen {

    /**
     * 用lambda表达式实现Runnable
     */
    @Test
    public void testRunnable(){
        //老版匿名内部类
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("444444444");
            }
        }).start();*/

        //新版写法
        new Thread( ()-> System.out.println("444444444") ).start();
    }

    /**
     * 迭代集合
     */
    @Test
    public void testList(){
        List<String> strs = new ArrayList<>();
        strs.add("123d");
        strs.add("abc");
        strs.add("123ee");
        strs.add("123ff");
        String ss = "a";
        ss += "bc";

        //打印
        //strs.forEach(n -> System.out.println(n));

        // 使用Java 8的方法引用更方便，方法引用由::双冒号操作符标示，
        // 看起来像C++的作用域解析运算符
        strs.forEach(System.out::println);
    }

    @Test
    public void testStr(){
        String str = "asfsd";
        //字符串是否以指定的前缀开头
        getStrTF(str,(s)->str.startsWith("asf"));

        List list = Arrays.asList("123a","123b");
        list.forEach(System.out::println);
    }

    public void getStrTF(String str, Predicate predicate){
        if(predicate.test(str)){
            System.out.println("result:" + str);
        }else{
            System.out.println("false");
        }
    }

    @Test
    public void test01(){
        System.out.println("-------");

    }
}
